]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
environment: reduce calls to g_time_zone_new_local()
authorFlorian Müllner <fmuellner@gnome.org>
Thu, 27 Feb 2020 21:46:44 +0000 (13:46 -0800)
committerChristian Hergert <chergert@redhat.com>
Thu, 27 Feb 2020 21:48:26 +0000 (13:48 -0800)
Creating a new GTimeZone for the local timezone can be quite expensive if
done repeatedly. It requires an open(), mmap(), and parsing of
/etc/localtime.

This patch was provided by Florian, and I've tested it as far back as
3.28.4 to ensure that we are really reducing the number of open() calls
on the compositor thread.

https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/1051

Signed-off-by: Christian Hergert <chergert@redhat.com>
js/ui/environment.js

index ba378e7d113496eda175dde300c3bf158b6d6dec..8ab9e7d444cdd515a6d4d29126989623bda5221e 100644 (file)
@@ -12,6 +12,9 @@ imports.gi.versions.TelepathyLogger = '0.2';
 
 const { Clutter, GLib, GObject, Meta, Shell, St } = imports.gi;
 const Gettext = imports.gettext;
+const System = imports.system;
+
+let _localTimeZone = null;
 
 // We can't import shell JS modules yet, because they may have
 // variable initializations, etc, that depend on init() already having
@@ -304,9 +307,25 @@ function init() {
         }
     };
 
+    // Override to clear our own timezone cache as well
+    const origClearDateCaches = System.clearDateCaches;
+    System.clearDateCaches = function () {
+        _localTimeZone = null;
+        origClearDateCaches();
+    };
+
     // Work around https://bugzilla.mozilla.org/show_bug.cgi?id=508783
     Date.prototype.toLocaleFormat = function (format) {
-        let dt = GLib.DateTime.new_from_unix_local(this.getTime() / 1000);
+        if (_localTimeZone === null)
+            _localTimeZone = GLib.TimeZone.new_local();
+
+        let dt = GLib.DateTime.new(_localTimeZone,
+            this.getYear(),
+            this.getMonth() + 1,
+            this.getDate(),
+            this.getHours(),
+            this.getMinutes(),
+            this.getSeconds());
         return dt ? dt.format(format) : '';
     };